"use strict";
// 泛型：软件工程中，我们不仅要创建一致的定义良好的api,同时也要考虑可重用性。
// 组件不仅能够支持当前的数据类型，同时也能支持未来的数据类型，这在创建大型系统时为你提供了十分灵活的功能。
// 在像c# 和java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据.
// 通俗理解:泛型就是解决 类 接口 方法的复用性,以及对不特定数据类型的支持(类型校验)
// 1.泛型的定义
// 泛型 :可以支持不特定的数据类型  要求:传入的参数和返回的参数一致
// T 表示泛型,具体什么类型是调用这个方法的时候决定的
function getData(value) {
    return value;
}
getData(123);
//2.泛型函数
// 3.泛型类
// 最小堆算法
class MinClas {
    constructor() {
        this.list = [];
    }
    add(value) {
        this.list.push(value);
    }
    min() {
        var miniNum = this.list[0];
        for (let i = 0; i < this.list.length; i++) {
            if (miniNum > this.list[i]) {
                miniNum = this.list[i];
            }
        }
        return miniNum;
    }
}
var m1 = new MinClas();
m1.add(1);
m1.add(2);
m1.add(3);
alert(m1.min()); //1
// 把类作为参数来约束数据传入的类型
// class User{
//   username:string | undefined
//   password:string |undefined
// }
// class MysqlDb{
//   add(user:User):boolean{
//     console.log(user);
//     return true    
//   }
// }
// class User{
//   username:string | undefined
//   password:string |undefined
// }
// class MysqlDb<T>{
//   add(user:T):boolean{
//     console.log(user);
//     return true    
//   }
// }
// let u = new User()
// u.username ='小花'
// u.password ='123'
// let Db =new MysqlDb<User>()
// Db.add(u)
// 4.泛型接口
// 函数类型接口
// interface configFn{
//   (value1:string,value2:string):string
// }
// var setDate:configFn =function(value1:string,value2:string):string{
//   return value1+ value2
// }
// setDate('name','张三')
// 第一种
// interface configFn{
//   <T>(value:T):T
// }
// var setData:configFn =function<T>(value:T):T{
//   return value
// }
// setData<string>('张三')
// setData<number>(123)
// 第二种
// interface configFn<T>{
//   <T>(value:T):T
// }
// function setData<T>(value:T):T{
//   return value
// }
// var mySetData:configFn<string> = setData
// mySetData('小花')
